<?php
App::uses('AppController', 'Controller');
App::uses('AuthComponent', 'Controller/Component');
/**
 * Utilisateurs Controller
 *
 * @property Utilisateur $Utilisateur
 * @property PaginatorComponent $Paginator
 * @property SessionComponent $Session
 */
class UtilisateursController extends AppController {

/**
 * Components
 *
 * @var array
 */

	public $components = array(
		'Paginator','Session',
		'Auth' => array(
			'loginAction' => array(
				'controller' => 'utilisateurs',
				'action' => 'login'
			),
			'authError' => 'Veuillez vous connecter',
			'authenticate' => array(
				'Form' => array(
					'userModel' => 'Utilisateur',
					'userFields' => array('id','nom_utilisateur','latitude','longitude'),
					'passwordHasher' => array(
						'className' => 'Simple',
						'hashType' => 'sha256'
					),
					'fields' => array(
						'username' => 'nom_utilisateur',
						'password' => 'password'
					),
				)
			),
			'loginRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
            'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home')
	));

/**
 * view method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function view($id = null) {
		if (!$this->Utilisateur->exists($id)) {
			throw new NotFoundException(__('Utilisateur invalide'));
		}
		$options = array('conditions' => array('Utilisateur.' . $this->Utilisateur->primaryKey => $id));
		$this->set('utilisateur', $this->Utilisateur->find('first', $options));
	}
	
/**
 * profil method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function profil() {
		$options = array('conditions' => array('Utilisateur.' . $this->Utilisateur->primaryKey => $this->Auth->user('id')));
		$this->set('utilisateur', $this->Utilisateur->find('first', $options));
	}

/**
 * add method
 * fonction appelée lors de l'inscription d'un nouvel utilsateur
 * @return void
 */
	public function add() {
		/* Si un utilisateur est déjà connecté, on le redirige vers son profil */
		if($this->Session->check('Auth.User')){
           $this->redirect(array('action' => 'profil'));      
        }
		/* Si des paramètres ont été postés */
		if ($this->request->is('post')) {
			/* On crée un nouvel utilisateur */
			$this->Utilisateur->create();
			/* On affecte le role d'id 100 correspondant aux utilisateurs normaux */
			$this->request->data['Utilisateur']['role_id'] = 100;
			/* On ajoute à l'utilisateur 4 cercles par défaut */
			$this->request->data['Cercle'] = array(array('nom'=>'Amis'),array('nom'=>'Famille'),array('nom'=>'Connaissances'),array('nom'=>'Professionnel'));
			/* 
			On sauvegarde les données en base, la validation des données s'effectuant dans le model Utilisateur.php
			*/
			if ($this->Utilisateur->saveAll($this->request->data)) {
				/* Si la sauvegarde s'est bien déroulée, on connecte l'utilisateur et on le redirige vers son profil */
				$this->request->data['Utilisateur'] = array_merge(
					$this->request->data['Utilisateur'],
					array('id' => $this->Utilisateur->id)
				);
				/* On "unset" le password en clair pour ne pas qu'il soit enregistré dans les données de la session */
				unset($this->request->data['User']['password']);
				/* On connecte l'utilisateur */
				$this->Auth->login($this->request->data['User']);
				/* On affichera un message dans la page pour signifier que tout s'est bien passé */
				$this->Session->setFlash(__('Votre compte a été créé.'));
				/* On redirige pour finir l'utilisateur vers son profil */
				return $this->redirect(array('action' => 'profil'));
			} else {
				/* 
				Si les données ne sont pas valides ou si la sauvegarde s'est mal passée on affiche un message
				*/
				$this->Session->setFlash(__('Votre compte n\'a pas été créé. Réessayer s\'il vous plaît.'));
			}
		}
		/* Récupération de liste des pays pour affichage dans le formulaire */
		$countries = $this->Utilisateur->Country->find('list',array('order'=>array('name')));
		/* On passe la variable countries dans la vue */
		$this->set(compact('countries'));
	}

/**
 * edit method
 * fonction appelée lors de l'édition d'un profil utilisateur
 * @throws NotFoundException, ForbiddenException
 * @return void
 */
	public function edit() {
	
		if ($this->request->is(array('post', 'put'))) {
			$this->request->data['Utilisateur']['role_id'] = 100;
			$this->request->data['Utilisateur']['id'] = $this->Auth->user('id');
			if ($this->Utilisateur->save($this->request->data)) {
				$this->Session->setFlash(__('Modifications du compte enregistrées.'));
				return $this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('Les modifications n\ont pas pu être enregistrées. Réessayez s\'il vous plaît'));
			}
			
		} else {
			$options = array('conditions' => array('Utilisateur.' . $this->Utilisateur->primaryKey => $this->Auth->user('id')));
			$this->request->data = $this->Utilisateur->find('first', $options);
		}
		$roles = $this->Utilisateur->Role->find('list');
		$countries = $this->Utilisateur->Country->find('list');
		$this->set(compact('roles', 'countries'));
	}

/**
 * login method
 *
 * @return void
 */
	public function login() {

        if($this->Session->check('Auth.User')){
           $this->redirect(array('action' => 'profil'));      
        }
         
        // if we get the post information, try to authenticate
        if ($this->request->is('post')) {

            if ($this->Auth->login()) {
                $this->Session->setFlash(__('Welcome, '. $this->Auth->user('nom_utilisateur')));
                $this->redirect($this->Auth->redirectUrl());
            } else {
                $this->Session->setFlash(__('Invalid username or password'));
            }
        }
    }
/**
 * logout method
 *
 * @return void
 */	
	public function logout()
	{
		$this->redirect($this->Auth->logout());
	}	
/**
 * admin_index method
 *
 * @return void
 */
	public function admin_index() {
		$this->Utilisateur->recursive = 0;
		$this->set('utilisateurs', $this->Paginator->paginate());
	}

/**
 * admin_view method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function admin_view($id = null) {
		if (!$this->Utilisateur->exists($id)) {
			throw new NotFoundException(__('Invalid utilisateur'));
		}
		$options = array('conditions' => array('Utilisateur.' . $this->Utilisateur->primaryKey => $id));
		$this->set('utilisateur', $this->Utilisateur->find('first', $options));
	}

/**
 * admin_add method
 *
 * @return void
 */
	public function admin_add() {
		if ($this->request->is('post')) {
			$this->Utilisateur->create();
			if ($this->Utilisateur->save($this->request->data)) {
				$this->Session->setFlash(__('Compte correctement créé.'));
				return $this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('Le compte n\'a pas pu être créé. Réessayez s\'il vous plaît.'));
			}
		}
		$roles = $this->Utilisateur->Role->find('list');
		$countries = $this->Utilisateur->Country->find('list');
		$this->set(compact('roles', 'countries'));
	}

/**
 * admin_edit method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function admin_edit($id = null) {
		if (!$this->Utilisateur->exists($id)) {
			throw new NotFoundException(__('Invalid utilisateur'));
		}
		if ($this->request->is(array('post', 'put'))) {
			if ($this->Utilisateur->save($this->request->data)) {
				$this->Session->setFlash(__('Informations du compte sauvegardées.'));
				return $this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('Les modifications n\'ont pas pu être sauvegardées. Réessuayez s\'il vous plaît.'));
			}
		} else {
			$options = array('conditions' => array('Utilisateur.' . $this->Utilisateur->primaryKey => $id));
			$this->request->data = $this->Utilisateur->find('first', $options);
		}
		$roles = $this->Utilisateur->Role->find('list');
		$countries = $this->Utilisateur->Country->find('list');
		$this->set(compact('roles', 'countries'));
	}

/**
 * admin_delete method
 *
 * @throws NotFoundException
 * @param string $id
 * @return void
 */
	public function admin_delete($id = null) {
		$this->Utilisateur->id = $id;
		if (!$this->Utilisateur->exists()) {
			throw new NotFoundException(__('Invalid utilisateur'));
		}
		$this->request->allowMethod('post', 'delete');
		if ($this->Utilisateur->delete()) {
			$this->Session->setFlash(__('The utilisateur has been deleted.'));
		} else {
			$this->Session->setFlash(__('The utilisateur could not be deleted. Please, try again.'));
		}
		return $this->redirect(array('action' => 'index'));
	}
	
	public function beforeFilter()
	{
		parent::beforeFilter();
		$this->Auth->allow('add','login','logout','view');
	}	
}
